package com.example.compare;

import lombok.extern.slf4j.Slf4j;

import java.util.HashSet;

/**
 * @author houyangfan
 * @version 1.0
 * @date 2022/7/18 19:09
 *
 * 该类是用于判断 Integer String Object 等对==和equeal的使用问题
 */
@Slf4j
public class CompareBug {

    public static void main(String[] args) {

        testCompare();
        //testLombokBug();
        //testLombokExtents();
    }

    public static void testInteger(){
        Integer a = 127; //Integer.valueOf(127)
        Integer b = 127; //Integer.valueOf(127)
        log.info("\nInteger a = 127;\n" +
                "Integer b = 127;\n" +
                "a == b ? {}",a == b);    // true
        Integer c = 128; //Integer.valueOf(128)
        Integer d = 128; //Integer.valueOf(128)
        log.info("\nInteger c = 128;\n" +
                "Integer d = 128;\n" +
                "c == d ? {}", c == d);   //false
        Integer e = 127; //Integer.valueOf(127)
        Integer f = new Integer(127); //new instance
        log.info("\nInteger e = 127;\n" +
                "Integer f = new Integer(127);\n" +
                "e == f ? {}", e == f);   //false
        Integer g = new Integer(127); //new instance
        Integer h = new Integer(127); //new instance
        log.info("\nInteger g = new Integer(127);\n" +
                "Integer h = new Integer(127);\n" +
                "g == h ? {}", g == h);  //false
        Integer i = 128; //unbox
        int j = 128;

        log.info("\nInteger i = 128;\n" +
                "int j = 128;\n" +
                "i == j ? {}", i == j); //true
    }

    /**
     * 对于对象之间的判等，equals 在默认情况下也是通过==来判断的，String Integer 等类可以判断内容，是因为重写了equals方法
     * 如果是自定义的对象进行equals判等的话，在值相同的情况下肯定为false，如果重写了equals则可以实现比较内容是否相同。
     *
     * 创建两个值一样的对象，将一个放入hashset中，判等set中是否有另一个对象，在不处理的情况下是没有的，将这个类重写hashcode方法后
     * 便会存在。因为散列表需要使用 hashCode 来定位元素放到哪个桶。
     */
    public static void testCompare(){
        Point p1 = new Point(1,2,"a");
        Point p3 = new Point(1,2,"a");
        HashSet<Point> pointSet = new HashSet<>();
        pointSet.add(p1);
        System.out.println(p1.hashCode());
        System.out.println(p3.hashCode());
        System.out.println(pointSet.contains(p3));
    }


    /**
     * 测试lombok中@Data 存在的bug
     */
    public static void testLombokBug(){
        Person p1 = new Person("hyf", "001");
        Person p2 = new Person("zhansgan", "001");

        System.out.println(p1.equals(p2));
    }

    /**
     * 测试lombok 的 @Data注解 继承之后判等的问题
     */
    public static void testLombokExtents(){
        Employee e1 = new Employee("hyf", "001", "cointiger");
        Employee e2 = new Employee("zhansgan", "002", "cointiger");

        System.out.println(e1.equals(e2));
    }



}
